x11: ensure some context is bound before calling glClientWaitSync
authorRay Strode <rstrode@redhat.com>
Mon, 22 Jun 2020 21:13:54 +0000 (17:13 -0400)
committerRay Strode <rstrode@redhat.com>
Mon, 22 Jun 2020 21:13:54 +0000 (17:13 -0400)
Since commit 972134abe48a4c9c7b6ad41b0723f30f4e7ae16b we now call
glClientWaitSync for the vendor nvidia driver, to know when a frame
is ready for the compositor to process.

glClientWaitSync can be called regardless of which context is currently
bound, but if no context is bound at all, it returns 0 without
doing anything.

This commit checks for that edge case, and ensures a context gets
made current in the event no context is already current, before calling
glClientWaitSync.

gdk/x11/gdkglcontext-x11.c

index 834d23ac931abb77943ded0b76a0e665d812daeb..d9e30ad09e62908ec7f79e0b8aac2780ccd2ac56 100644 (file)
@@ -606,6 +606,14 @@ on_gl_surface_xevent (GdkGLContext   *context,
     {
       GLenum wait_result;
 
+      /* We don't care if the passed context is the current context,
+       * necessarily, but we do care that *some* context is bound,
+       * otherwise, the GL dispatch layer will make glClientWaitSync()
+       * silently return 0.
+       */
+      if (glXGetCurrentContext () == NULL)
+        gdk_gl_context_make_current (context);
+
       wait_result = glClientWaitSync (context_x11->frame_fence, 0, 0);
 
       switch (wait_result)